package com.saturday.common.util;

import com.saturday.common.constants.ResultConsts;
import com.saturday.common.model.HeaderContext;
import com.saturday.common.model.Meta;
import com.saturday.common.model.Pagination;
import com.saturday.common.model.vo.ResponseVO;
import com.saturday.common.support.HeaderContextHolder;
import com.github.pagehelper.PageInfo;
import org.apache.commons.lang3.StringUtils;

public class ResultUtils {

    /**
     * 未登录返回值
     *
     * @return
     */
    public static ResponseVO notLogin() {
        return createResponseVO(null, "登录已过期，请重新登录", ResultConsts.NOT_LOGIN);
    }

    /**
     * 前端，不会提示
     * message：操作成功
     *
     * @return
     */
    public static ResponseVO success() {
        return success(new Object());
    }

    /**
     * 前端，吐丝提示
     *
     * @param message 提示信息
     * @return
     */
    public static ResponseVO success(String message) {
        return success(new Object(), message);
    }

    /**
     * 前端，不会提示信息
     *
     * @param data 业务数据
     * @return
     */
    public static ResponseVO success(Object data) {
        return createResponseVO(data, "操作成功！", getSuccessCode(ResultConsts.TYPE_CODE.SILENT.getKey()));
    }

    /**
     * 前端，吐丝提示
     *
     * @param data    返回数据
     * @param message 业务数据
     * @return
     */
    public static ResponseVO success(Object data, String message) {
        return createResponseVO(data, message, getSuccessCode(ResultConsts.TYPE_CODE.PROMPT.getKey()));
    }


    /**
     * 前端，吐丝提示
     *
     * @param data    业务数据
     * @param message 信息描述
     * @param code    状态编码
     * @return
     */
    public static ResponseVO success(Object data, String message, ResultConsts.TYPE_CODE typeCode, Integer code) {
        return createResponseVO(data, message, Integer.valueOf(typeCode.getKey() + code));
    }

    /**
     * 前端，吐丝警告
     *
     * @param message 信息描述
     * @return
     */

    public static ResponseVO warn(String message) {
        return warn(message, ResultConsts.WARN_STATUS);
    }

    /**
     * 前端，吐丝警告
     *
     * @param message 信息描述
     * @param code    状态编码
     * @return
     */
    private static ResponseVO warn(String message, Integer code) {
        return createResponseVO(new Object(), message, getWarnCode(code));
    }

    /**
     * 前端，吐丝错误
     *
     * @param message 信息描述
     * @return
     */
    public static ResponseVO error(String message) {
        return error(message, String.valueOf(ResultConsts.ERROR_STATUS));
    }

    /**
     * 前端，吐丝错误
     *
     * @param message 信息描述
     * @param code    状态编码
     * @return
     */
    public static ResponseVO error(String message, String code) {
        return createResponseVO(new Object(), message, getErrorCode(code));
    }

    /**
     * 错误手动关闭
     *
     * @param message
     * @param code
     * @return
     */
    public static ResponseVO errorManual(String message, String code) {
        return createResponseVO(new Object(), message, getErrorCodeManual(code));
    }


    /**
     * 移动端 错误手动关闭
     *
     * @param message
     * @param code
     * @return
     */
    public static ResponseVO appErrorManual(String message, String code) {
        return createResponseVO(new Object(), message, getAppErrorCodeManual(code));
    }

    /**
     * 状态码以输入的为准
     *
     * @param message 错误信息
     * @param code    状态码
     * @return
     */
    public static ResponseVO defaultError(String message, Integer code) {
        return createResponseVO(new Object(), message, code);
    }

    private static ResponseVO createResponseVO(Object data, String message, Integer code) {
        ResponseVO responseVO = new ResponseVO();
        responseVO.setMessage(message);
        responseVO.setCode(code);

        Meta meta = new Meta();
        if (null != data && PageInfo.class.isAssignableFrom(data.getClass())) {
            PageInfo<?> pageInfo = (PageInfo<?>) data;
            Pagination pagination = new Pagination();
            pagination.setPage(pageInfo.getPageNum());
            pagination.setLimit(pageInfo.getPageSize());
            pagination.setTotal(pageInfo.getTotal());
            pagination.setPages(pageInfo.getPages());
            meta.setPagination(pagination);

            responseVO.setData(pageInfo.getList());
        } else {
            responseVO.setData(data == null ? new Object() : data);
        }
        HeaderContext headerContext = HeaderContextHolder.get();
        meta.setTraceId(headerContext.getTraceId());
        responseVO.setMeta(meta);

        return responseVO;
    }

    /**
     * success 消息码
     *
     * @param typeCode
     * @return
     */
    private static Integer getSuccessCode(Integer typeCode) {
        String code = typeCode + ResultConsts.SUCCESS_STATUS + "";
        return Integer.valueOf(code);
    }

    /**
     * warn 消息码
     *
     * @return
     */
    private static Integer getWarnCode(Integer code) {
        return Integer.valueOf(ResultConsts.TYPE_CODE.WARN.getKey() + code);
    }

    /**
     * error 消息码
     *
     * @param code
     * @return
     */
    private static Integer getErrorCode(String code) {
        if (StringUtils.isNotEmpty(code) && code.length() == 3) {
            return Integer.valueOf(ResultConsts.TYPE_CODE.ERROR.getKey() + code);
        }
        return Integer.valueOf(ResultConsts.TYPE_CODE.ERROR.getKey() + code);
    }

    /**
     * error 消息码
     *
     * @param code
     * @return
     */
    private static Integer getErrorCodeManual(String code) {
        if (StringUtils.isNotEmpty(code) && code.length() == 3) {
            return Integer.valueOf(ResultConsts.TYPE_CODE.ERROR_MANUAL.getKey() + code);
        }
        return Integer.valueOf(ResultConsts.TYPE_CODE.ERROR_MANUAL.getKey() + code);
    }

    /**
     * error 消息码  移动端
     *
     * @param code
     * @return
     */
    private static Integer getAppErrorCodeManual(String code) {
        if (StringUtils.isNotEmpty(code) && code.length() == 3) {
            return Integer.valueOf(ResultConsts.TYPE_CODE.APP_ERROR_MANUAL.getKey() + code);
        }
        return Integer.valueOf(ResultConsts.TYPE_CODE.APP_ERROR_MANUAL.getKey() + code);
    }

}
